﻿// -----------------------------------------------------------------------
// <copyright file="SQLPattern.cs" company="Hexacta S.A.">
// TODO: Update copyright text.
// </copyright>
// -----------------------------------------------------------------------

namespace parser
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using gudusoft.gsqlparser;
    using System.Collections;
    using System.Collections;
    using generador;

    /// <summary>
    /// TODO: Update summary.
    /// </summary>
    public class SQLPattern
    {
        private int sumatoria_de_tiempo = 0;
        public int MinTime { get; set; }
        public int MaxTime { get; set; }
        public double AverageTime{  get {return SlowQueries.Count > 0 ? sumatoria_de_tiempo / SlowQueries.Count : 0;} }
        public string PatternName { get; set; }
        public List<InfoDeLaQuery> SlowQueries { get; set; } //todas las queryes sin subdividir

        //agrupo por los campos que selecciona
        Dictionary<string, SQLPatternSubGroup> diccionario_de_subpatrones = new Dictionary<string, SQLPatternSubGroup>();
       
        public ISet<string> Tablas { get; set; }

        public SQLPattern( string patternName, List<InfoDeLaQuery> queries, List<SQLPatternSubGroup> subgroups)
        {
            PatternName = patternName;
            SlowQueries = queries;
            MinTime = int.MaxValue;
            MaxTime = 0;
        }

        public SQLPattern()
        {
            MinTime = int.MaxValue;
            MaxTime = 0;
            PatternName = string.Empty;
            SlowQueries = new List<InfoDeLaQuery>();

        }

        
        public virtual void AgregarNuevaQuery(InfoDeLaQuery info)
        {
            CalculosGeneralesYAgregarAlCjto(info);
            AgregarAlSubGrupoCorrespondiente(info);
        }

        private void AgregarAlSubGrupoCorrespondiente(InfoDeLaQuery info)
        {
            string sub_patron_key = ObtenerNombreSubPatron(info);


            SQLPatternSubGroup el_sub_patron;
            if (diccionario_de_subpatrones.ContainsKey(sub_patron_key))
            {
                el_sub_patron = diccionario_de_subpatrones[sub_patron_key];
                el_sub_patron.AgregarNuevaQuery(info);
            }
            else
            {
                el_sub_patron = new SQLPatternSubGroup(this);
                el_sub_patron.AgregarNuevaQuery(info);

                diccionario_de_subpatrones.Add(sub_patron_key, el_sub_patron);
            }
        }

        protected void CalculosGeneralesYAgregarAlCjto(InfoDeLaQuery info)
        {
            sumatoria_de_tiempo += info.QueryTime;

            MinTime = Math.Min(MinTime, info.QueryTime);
            MaxTime = Math.Max(MaxTime, info.QueryTime);

            SlowQueries.Add(info);//al conjunto de todas las queryes
        }

        private string ObtenerNombreSubPatron(InfoDeLaQuery info)
        {
            //la clave para identificar un subpatron va a ser tomar los campos de la query y ordenarlos alfabeticamente y formar un string
            string resultado = string.Empty;

            IList<string> campos_ordenados = ListaOrdenadaDeNombresDeCampos(info);

            for (int i = 0; i < campos_ordenados.Count; i++)
            {
                resultado += campos_ordenados[i] + "#";
            }

            return resultado;
        }

        private IList<string> ListaOrdenadaDeNombresDeCampos(InfoDeLaQuery info)
        {
            IList<string> campos = new List<string>();
            TLzFieldList lista_de_campos;
            lista_de_campos=info.Query.Fields;
            foreach (TLzField field in lista_de_campos)
            {
                campos.Add(field.FieldName);
            }
            string[] campos2 = campos.ToArray();
            Array.Sort(campos2);
            return campos2;
        }
    }
}

